#include "moteurGraphique.h"


void MoteurGraphique::executer() {
    if (!this->fileMessages.empty()) {
        traiterMessage(this->fileMessages.front());
        this->fileMessages.pop();
    }

    app->processEvents();
}

void MoteurGraphique::traiterMessage(Message m) {
    switch (m.getType()) {
        /*case DEMANDE_CONNEXION: // ???
            traiterDemandeConnexion(m);
            break;
*/
        case LISTE_PARTIES_OUVERTES:
            traiterListePartiesOuvertes(m);
            break;
        case INVITATION:
            traiterInvitation(m);
            break;
        case PARTIE_ACCEPTEE:
            traiterPartieAcceptee(m);
            break;
        case PARTIE_REFUSEE:
            traiterPartieRefusee(m);
            break;

        case ECHIQUIER_MODIFIE:
            traiterEchiquierModifie(m);
            break;
        case FIN_PARTIE:
            traiterFinPartie(m);
            break;
        case ECHEC:
            traiterEchec(m);
            break;
        case MAUVAIS_COUP:
            traiterMauvaisCoup(m);
            break;



        // messages ajoutés (??!!!)
        case SAISIE_PIECE:
            if (m.getEntier(0))
                fenetrePrincipale->getGLWidget()->setPicking(true);
            else
                fenetrePrincipale->getGLWidget()->setPicking(false);
            break;
    }
}



//void MoteurGraphique::traiterDemandeConnexion(Message m) {  // ???
//    this->boiteDialogueAttenteJoueurs.ajouterJoueur(m.listeChaines.get(0)/*nom_joueur*/, m.listeChaines.get(1)/*ip*/, m.listeEntiers.get(0)/*port*/);
//}


void MoteurGraphique::traiterListePartiesOuvertes(Message m) {
    //this->boiteDialogueListeParties.setListeParties(m.listeParties);
}

void MoteurGraphique::traiterInvitation(Message m) {
    //BoiteDialogue boite = new BoiteDialogueInvitation(m.listeChaines.get(0)/*nom_joueur*/, m.listeChaines.get(1)/*nom_partie*/, m.listeChaines.get(2)/*ip*/, m.listeEntiers.get(0)/*port*/);
    //boite.show();
    QMessageBox::information(this->fenetrePrincipale, "Invitation", (QString("Vous avez recu une invitation de la part de <strong>").append(m.getChaine(0).c_str())).append("</strong>."));

    Message msg(CREER_PARTIE);
    msg.ajouterJoueur(new JoueurReseau((MoteurJeu *)moteurJeu,"blanc",BLANC,0,m.getChaine(0)));
    msg.ajouterJoueur(new Joueur((MoteurJeu *)moteurJeu,"noir",NOIR,0));
    moteurJeu->envoyerMessage(msg);

    moteurReseau->envoyerMessage(Message(ACCEPTER_PARTIE));
}

void MoteurGraphique::traiterPartieAcceptee(Message m) {
    //BoiteDialogue boite = new BoiteDialogueAccepte(m.listeChaines.get(0)/*nom_partie*/, m.listeChaines.get(1)/*ip*/, m.listeEntiers.get(0)/*port*/);
    //boite.show();
    QMessageBox::information(this->fenetrePrincipale, "Partie Acceptee", (QString("<strong>").append(m.getChaine(0).c_str())).append("</strong> a accepte votre invitation."));

    Message msg(CREER_PARTIE);
    msg.ajouterJoueur(new Joueur((MoteurJeu *)moteurJeu,"blanc",BLANC,0));
    msg.ajouterJoueur(new JoueurReseau((MoteurJeu *)moteurJeu,"noir",NOIR,0,m.getChaine(0)));
    moteurJeu->envoyerMessage(msg);
}

void MoteurGraphique::traiterPartieRefusee(Message m) {
    //BoiteDialogue boite = new BoiteDialogueRefus(m.listeChaines.get(0)/*nom_partie*/, m.listeChaines.get(1)/*ip*/, m.listeEntiers.get(0)/*port*/);
    //boite.show();
}


void MoteurGraphique::traiterEchiquierModifie(Message m) {
    this->fenetrePrincipale->getGLWidget()->updateGL();
    //this->fenetre->getOpenGLWidget()->redessiner();
}

void MoteurGraphique::traiterFinPartie(Message m) {
//    switch (m.resultat) {
//        case GAIN_ECHEC:
//            BoiteDialogue boite = new BoiteDialogueGainEchec(m.listeChaines.get(0)/*joueur_vainqueur*/, m.listeJoueurs.get(0)/*nom_joueur1*/, m.listeJoueurs.get(1)/*nom_joueur2*/);
//            boite.show();
//        case GAIN_ABANDON:
//            BoiteDialogue boite = new BoiteDialogueGainAbandon(m.listeChaines.get(0)/*joueur_vainqueur*/, m.listeJoueurs.get(0)/*nom_joueur1*/, m.listeJoueurs.get(1)/*nom_joueur2*/);
//            boite.show();
//        case PERTE:
//            BoiteDialogue boite = new BoiteDialoguePerte(m.listeChaines.get(0)/*joueur_vainqueur*/, m.listeJoueurs.get(0)/*nom_joueur1*/, m.listeJoueurs.get(1)/*nom_joueur2*/);
//            boite.show();
//        case ABANDON:
//            BoiteDialogue boite = new BoiteDialogueAbandon(m.listeChaines.get(0)/*joueur_vainqueur*/, m.listeJoueurs.get(0)/*nom_joueur1*/, m.listeJoueurs.get(1)/*nom_joueur2*/);
//            boite.show();
//        case NUL:
//            BoiteDialogue boite = new BoiteDialogueNul(m.listeJoueurs.get(0)/*nom_joueur1*/, m.listeJoueurs.get(1)/*nom_joueur2*/);
//            boite.show();
//    }
}

void MoteurGraphique::traiterEchec(Message m) {
    QMessageBox::information(this->fenetrePrincipale, "Echec", (QString("Le joueur <strong>").append(m.getChaine(0).c_str())).append("</strong> est en echec."));
}

void MoteurGraphique::traiterMauvaisCoup(Message m) {
    //moteurSon->envoyerMessage(Message(JOUER_SON, "MauvaisCoup.mp3"));
}

